/**
 * 解析 UIR 参数，返回参数对象
 * @param {string} url
 * @param {string} paramName 参数名称
 * @returns {Object}
 */
export function getURLParams(url, paramName = "") {
  const search = decodeURIComponent(url.split("?")[1]).replace(/\+/g, " ");
  if (!search) {
    return {};
  }
  const obj = {};
  const searchArr = search.split("&");
  searchArr.forEach((v) => {
    const index = v.indexOf("=");
    if (index !== -1) {
      const name = v.substring(0, index);
      obj[name] = v.substring(index + 1, v.length);
    }
  });
  return paramName ? obj[paramName] : obj;
}

/**
 * 防抖函数：当事件被触发时，设定一个周期延迟执行动作，若期间又被触发，则重新设定周期，直到周期结束，执行动作
 * @param fn 回调函数
 * @param interval 间隔时间
 * @returns {(function(): void)|*}
 */
export function debounce(fn, interval = 300) {
  let time = null;
  return function () {
    const that = this;
    const args = arguments;
    if (time) {
      clearTimeout(time);
    }
    time = setTimeout(() => {
      fn.call(that, ...args);
    }, interval);
  };
}

/**
 * 节流函数：也就是让函数执行一次后，在某个时间段内暂时失效，过了这段时间后再重新激活，类似于技能冷却时间
 * @param fn 回调函数
 * @param interval 间隔时间
 * @returns {(function(): (boolean|undefined))|*}
 */
export function throttle(fn, interval = 300) {
  let valid = true;
  return function () {
    const that = this;
    const args = arguments;
    if (!valid) {
      return false;
    }
    valid = false;
    setTimeout(() => {
      fn.call(that, ...args);
      valid = true;
    }, interval);
  };
}
